home *** CD-ROM | disk | FTP | other *** search
- 10 REM BLAKJAK.BAS 3/2/82
- 20 REM PROGRAM BY TOM SPRINGALL
- 30 REM ADAPTED FROM AN APL PROGRAM BY CHARLIE SOLOMON
- 40 MENU$="NO"
- 50 GOTO 110
- 100 MENU$="YES"
- 110 OPTION BASE 0:DEFINT A,C-Z:DIM DK(52),NUM$(13)
- 120 T$=TIME$:X=0:DKI=0
- 130 FOR I = 2 TO 3:X=X*60+ VAL(MID$(T$,(3*I-2),2)):NEXT:RANDOMIZE X-32000
- 140 DATA A,"2","3","4","5","6","7","8","9","10",J,Q,K
- 150 FOR I=1 TO 13:READ NUM$(I):NEXT I
- 160 SUITS$(1)=CHR$(3):SUITS$(2)=CHR$(4):SUITS$(3)=CHR$(5):SUITS$(4)=CHR$(6)
- 170 KEY OFF:CLS
- 180 GOSUB 2140 ' 1ST SCREEN OF INSTRUCTIONS
- 190 LOCATE 23,1,1:INPUT;"STAKE";STKE:BAL=STKE
- 200 CLS:GOSUB 2320 ' 2ND SCREEN
- 210 X$="FIRST BET (0 TO QUIT)"
- 220 IF BAL<=0 GOTO 1210
- 230 GOSUB 1720 ' DISPLAY BALANCE
- 240 HNDS=1:N=1:GOSUB 1810 ' GET BET
- 250 CLS:IF DKI<16 THEN GOSUB 1500 'FRESH DECK
- 260 LOCATE 1,1,0:PRINT "DEALER'S HAND:"
- 270 LOCATE 12,1,0:PRINT "YOUR HAND:";
- 280 BT(1)=BT:BAL=BAL-BT:LOCATE 12,25,0:PRINT USING "BET: $$####.##";BT;
- 290 GOSUB 1720 ' DISPLAY BALANCE
- 300 LOCATE 23,1,0:PRINT SPACE$(30);
- 310 GOSUB 1440:PH$(1)=X$:PVAL(N)=XVAL:PACE(N)=XACE:PSV(1)=V
- 320 R=14:C=5:PMC=7:AH=0:GOSUB 1740:GOSUB 1930
- 330 GOSUB 1440:DH$(1)=X$:DVAL=XVAL:DACE=XACE
- 340 R=3:C=17:DC=17:GOSUB 1740:GOSUB 1930
- 350 GOSUB 1440:PH$(2)=X$:PVAL(N)=PVAL(N)+XVAL:PACE(N)=PACE(N)+XACE:PHI=2
- 360 PSV(2)=V:R=14:C=11:PC=11:GOSUB 1740:GOSUB 1930
- 370 GOSUB 1440:DH$(2)=X$:DVAL=DVAL+XVAL:DACE=DACE+XACE:DHI=2
- 380 R=3:C=5:X$=CHR$(21):GOSUB 1740:GOSUB 1890:PSV=PSV(2)
- 390 IF BAL<.5*BT OR "A"<>LEFT$(DH$(1),1) GOTO 500
- 400 LOCATE 23,1,1:PRINT "WANT TO BUY INSURANCE? (Y/N) ";
- 410 X$=INKEY$:IF X$="" GOTO 410
- 420 IF ASC(X$)=27 GOTO 2120
- 430 LOCATE 23,1,0:PRINT SPACE$(30);
- 440 IF X$="Y" OR X$="y" THEN BAL=BAL-.5*BT:GOTO 460
- 450 IF X$="N" OR X$="n" GOTO 500 ELSE 400
- 460 LOCATE 25,1,0:IF DVAL=11 AND DACE=1 GOTO 490
- 470 GOSUB 1720:PRINT "DEALER DOESN'T HAVE BLACKJACK. ";
- 480 PRINT USING "HE COLLECTS YOUR $$##.##";.5*BT;:GOTO 510
- 490 PRINT "DEALER PAYS $";2*BT;" ON INSURANCE.";:BAL=BAL+2*BT:GOTO 520
- 500 IF DVAL=11 AND DACE=1 GOTO 520
- 510 IF PVAL(N)=11 AND PACE(N)=1 GOTO 550 ELSE 560
- 520 GOSUB 1960:GOSUB 2000 ' DEALER HAS BLACKJACK
- 530 IF PVAL(N)=11 AND PACE(N)=1 GOTO 540 ELSE GOSUB 2050:GOTO 1190
- 540 GOSUB 1990:BAL=BAL+BT:GOTO 1190 ' PLAYER AND DEALER HAVE BLACKJACK
- 550 GOSUB 1990:GOSUB 1960:BAL=BAL+2.5*BT:GOTO 1190 'ONLY PLAYER HAS BLACKJACK
- 560 IF BAL<BT(N) GOTO 710
- 570 IF LEFT$(PH$(1),1)<>LEFT$(PH$(2),1) AND PVAL(N)<>20 THEN IF AH=0 GOTO 710 ELSE 900
- 580 LOCATE 23,1,1:PRINT "DO YOU WANT TO SPLIT THE HAND? (Y/N) ";
- 590 X$=INKEY$:IF X$="" GOTO 590
- 600 IF ASC(X$)=27 GOTO 2120
- 610 LOCATE 23,1,1:PRINT SPACE$(38);
- 620 IF X$="Y" OR X$="y" THEN BAL=BAL-BT(N):GOSUB 1720:GOTO 640
- 630 IF X$="N" OR X$="n" GOTO 710 ELSE 580
- 640 HNDS=HNDS+1:PSV(HNDS)=PSV:BT(HNDS)=BT:GOSUB 1570
- 650 PHI=1:PVAL(N)=.5*PVAL(N):PVAL(HNDS)=PVAL(N)
- 660 PACE(N)=.5*PACE(N):PACE(HNDS)=PACE(N)
- 670 LOCATE 25,1,0:PRINT "HAND IS SPLIT.";
- 680 PRINT USING " THE BET ON EACH HAND IS $$##.##.";BT(N);
- 690 IF PVAL(N) <> 1 GOTO 830
- 700 PRINT " ACES...ONE MORE CARD...";:AH=1:GOTO 940
- 710 IF (PVAL(N)=10 OR PVAL(N)=11) AND PACE(N)=0 AND BAL>=BT(N) GOTO 720 ELSE 830
- 720 LOCATE 23,1,0:PRINT SPACE$(30);
- 730 LOCATE 23,1,1:PRINT "HIT,STAND OR DOUBLE? (H/S/D) ";
- 740 X$=INKEY$:IF X$="" GOTO 740
- 750 IF ASC(X$)=27 GOTO 2120
- 760 IF X$="H" OR X$="h" GOTO 940 ";
- 770 IF X$="D" OR X$="d" THEN BAL=BAL-BT(N):GOTO 790
- 780 IF X$="S" OR X$="s" GOTO 900 ELSE 720
- 790 GOSUB 1720 ' DISPLAY BALANCE
- 800 BT(N)=2*BT(N):LOCATE 12,30,0:PRINT USING "$$####.##";BT(N);
- 810 LOCATE 25,1,0:PRINT USING "THE BET IS DOUBLED TO $$###.##";BT(N);
- 820 PRINT " ---- YOU GET ONE MORE CARD ----";:AH=1:GOTO 940
- 830 LOCATE 23,1,0:PRINT SPACE$(30);
- 840 LOCATE 23,13,0:PRINT " ";:LOCATE 23,1,1:PRINT "HIT OR STAND? (H/S) ";
- 850 X$=INKEY$:IF X$="" GOTO 850
- 860 IF ASC(X$)=27 GOTO 2120
- 870 PRINT X$;:IF X$="H" OR X$="h" GOTO 940
- 880 IF X$="S" OR X$="s" GOTO 900
- 890 LOCATE 25,1,0:PRINT "RESPOND WITH `H' FOR HIT OR `S' FOR STAND.";:GOTO 830
- 900 V(1)=PVAL(N):V(2)=PACE(N):GOSUB 1690:PVAL(N)=V
- 910 IF HNDS=N GOTO 980
- 920 FOR I=1 TO 1000:NEXT I:N=N+1:GOSUB 1570
- 930 IF PVAL(N)=1 GOTO 940 ELSE AH=0:GOTO 830
- 940 GOSUB 1540:V(1)=PVAL(N):V(2)=PACE(N):GOSUB 1690 'PLAYER ASKED FOR HIT
- 950 IF V<=21 THEN IF PHI=2 GOTO 560 ELSE IF AH=0 GOTO 830 ELSE 900
- 960 GOSUB 2010:GOTO 910 ' PLAYER IS BUSTED
- 970 GOSUB 1960:GOTO 1190 'DEALER SHOWS
- 980 GOSUB 1960:FOR I=1 TO HNDS:IF PVAL(I)<=21 GOTO 1000 'DOES DEALER PLAY?
- 990 NEXT I:GOTO 1190
- 1000 V(1)=DVAL:V(2)=DACE:GOSUB 1690: IF V>16 GOTO 1110 'DEALER PLAYS
- 1010 LOCATE 13,1,0:PRINT SPACE$(70);
- 1020 FOR I=1 TO 500:I=I:NEXT I
- 1030 GOSUB 1440:DHI=DHI+1:DH$(DHI)=X$:DVAL=DVAL+XVAL
- 1040 DACE=DACE+XACE:R=3:DC=DC+6:C=DC:GOSUB 1740:GOSUB 1930
- 1050 V(1)=DVAL:V(2)=DACE:GOSUB 1690: IF V<17 GOTO 1020
- 1060 IF V<=21 GOTO 1110
- 1070 REM DEALER BUSTS
- 1080 GOSUB 1960:GOSUB 2020
- 1090 IF HNDS<>1 THEN DVAL=0:GOTO 1260
- 1100 BAL=BAL+2*BT(N):GOSUB 2040:GOTO 1190
- 1110 IF HNDS>1 THEN DVAL=V:GOTO 1260
- 1120 ON 2+SGN(PVAL(N)-V) GOTO 1140,1160,1180
- 1130 REM PLAYER LOSES
- 1140 GOSUB 2050:GOTO 1190
- 1150 REM TIE
- 1160 GOSUB 2030:BAL=BAL+BT(N):GOTO 1190
- 1170 REM PLAYER WINS
- 1180 GOSUB 2040:BAL=BAL+2*BT(N):GOTO 1190
- 1190 X$="NEXT BET (0 TO QUIT)"
- 1200 LOCATE 12,30,0:PRINT SPACE$(9);:GOTO 220
- 1210 LOCATE 23,1,1
- 1220 PRINT USING "THE GAME IS OVER. YOU BEGAN WITH $$###.##.";STKE;
- 1230 PRINT USING " YOU ENDED WITH $$###.##.";BAL;:PRINT SPACE$(12)
- 1240 PRINT SPACE$(79);
- 1250 LOCATE 25,1,0:PRINT SPACE$(79);:GOTO 2120
- 1260 REM TALLY DEALER VS PLAYER FOR MULTIPLE GAMES
- 1270 IF HNDS=2 GOTO 1370
- 1280 A=0:B=0:FOR I =1 TO HNDS:IF PVAL(I)>21 GOTO 1310
- 1290 IF PVAL(I)>DVAL THEN A=A+1:BAL=BAL+2*BT(N) ' COUNT WIN
- 1300 IF PVAL(I)=DVAL THEN B=B+1:BAL=BAL+BT(N) ' TIE
- 1310 NEXT I
- 1320 X$=STR$(HNDS)+" HANDS. ":C=HNDS-A-B
- 1330 IF A>0 THEN X$=X$+"YOU WON"+STR$(A)+". "
- 1340 IF B>0 THEN X$=X$+"YOU TIED"+STR$(B)+". "
- 1350 IF C>0 THEN X$=X$+"YOU LOST"+STR$(C)+". "
- 1360 COLOR 0,7:GOSUB 2080:GOTO 1190
- 1370 FOR I=1 TO 2:PMC=7+35*(I-1):PC=PMC+4
- 1380 IF PVAL(I)>21 GOTO 1420
- 1390 IF PVAL(I)>DVAL THEN BAL=BAL+2*BT(I):GOSUB 2040:GOTO 1420
- 1400 IF PVAL(I)=DVAL THEN BAL=BAL+BT(I):GOSUB 2030:GOTO 1420
- 1410 GOSUB 2050
- 1420 NEXT I:GOTO 1190
- 1430 REM GET NEXT CARD
- 1440 I=1+INT(DKI*RND):V=DK(I):PSV=V:DKI=DKI-1
- 1450 FOR I=I TO DKI:DK(I)=DK(I+1):NEXT I
- 1460 REM TEMP LINES
- 1470 REM LOCATE 3,60,1:INPUT;"CARD NO. ",V:PSV=V
- 1480 XVAL=1+(V-1) MOD 13:X$=NUM$(XVAL):IF XVAL>10 THEN XVAL=10
- 1490 X$=X$+SUITS$(1+INT((V-1)/13)):XACE=ABS(XVAL=1):RETURN
- 1500 REM FRESH DECK
- 1510 FOR I=1 TO 52:DK(I)=I:NEXT:DKI=52
- 1520 COLOR 31:LOCATE 1,60,0:PRINT "*** FRESH DECK ***";:COLOR 7:RETURN
- 1530 REM PLAYER ASKED FOR A HIT
- 1540 GOSUB 1440:PHI=PHI+1:PH$(PHI)=X$
- 1550 PVAL(N)=PVAL(N)+XVAL:PACE(N)=PACE(N)+XACE
- 1560 R=14:PC=PC+6:C=PC:GOSUB 1740:GOSUB 1930:RETURN
- 1570 REM DISPLAY HAND # AND PENDING HANDS
- 1580 IF N=2 AND HNDS=2 THEN X=1:PMC=42:GOTO 1600 ELSE X=0:PMC=7
- 1590 FOR I=13 TO 21:LOCATE I,1,0:PRINT SPACE$(79);:NEXT I
- 1600 LOCATE 13,6,0:COLOR 15,0:PRINT SPACE$(35*X);"HAND #";N;:COLOR 7,0
- 1610 V=PSV(N):GOSUB 1480:R=14:C=5+35*X:PC=C:GOSUB 1740:GOSUB 1930:PHI=1
- 1620 C=40:IF N=1 OR X=1 GOTO 1660
- 1630 FOR J=1 TO N-1:IF PVAL(J)>21 THEN X$=" BUST" ELSE X$=STR$(PVAL(J))
- 1640 LOCATE 14+J,C,0:PRINT "HAND";STR$(J);":";X$;:NEXT J:C=C+13
- 1650 IF N=HNDS THEN RETURN ' NO MORE PENDING HANDS?
- 1660 FOR J=N+1 TO HNDS:IF C>68 THEN RETURN ELSE LOCATE 13,C+1,0
- 1670 PRINT "#";J;:V=PSV(J):GOSUB 1480:GOSUB 1740:GOSUB 1930
- 1680 C=C+6:NEXT J:RETURN
- 1690 REM CALCULATE BEST SCORE. V=VALUE, # ACES
- 1700 IF V(2)=0 OR V(1)>=21 OR (V(1)+10)>21 THEN V=V(1):RETURN
- 1710 V(1)=V(1)+10:V(2)=V(2)-1:GOTO 1690
- 1720 REM DISPLAY BALANCE
- 1730 LOCATE 23,60,0:PRINT USING "BALANCE: $$####.##";BAL;:RETURN
- 1740 REM SHOWS EMPTY CARD AT R,C
- 1750 LOCATE R,C,0:PRINT CHR$(218);STRING$(9,196);CHR$(191);
- 1760 FOR I=R+1 TO R+6
- 1770 LOCATE I,C,0:PRINT CHR$(179);SPACE$(9);CHR$(179);:NEXT I
- 1780 LOCATE R+7,C,0:PRINT CHR$(192);STRING$(9,196);CHR$(217);
- 1790 RETURN
- 1800 REM GET BET. X$ IS PROMPT MSG
- 1810 A$=INKEY$:IF A$<>"" THEN IF ASC(A$)=27 GOTO 2120 ELSE 1810
- 1820 LOCATE 23,1,0:PRINT SPACE$(30);
- 1830 LOCATE 23,1,1:PRINT X$;:INPUT;BT
- 1840 IF BT=0 THEN GOTO 1210
- 1850 LOCATE 25,1,0
- 1860 IF BT<0 THEN PRINT "NEGATIVE BETS NOT ALLOWED.";:GOTO 1830
- 1870 IF BT>BAL THEN PRINT "NO CREDIT! YOU HAVE ONLY $";BAL;:GOTO 1830
- 1880 RETURN
- 1890 REM FILL BACK OF CARD AT R,C WITH X$
- 1900 FOR I=R+1 TO R+6
- 1910 LOCATE I,C+1,0:PRINT STRING$(9,X$);
- 1920 NEXT I:RETURN
- 1930 REM SHOWS VALUE (X$) IN ULHC AND LRHC OF CARD AT R,C
- 1940 LOCATE R+1,C+1,0:PRINT X$;
- 1950 LOCATE R+6,C+10-LEN(X$),0:PRINT X$;:RETURN
- 1960 REM REVEAL DEALER'S HOLE CARD
- 1970 R=3:C=5:X$=" ":GOSUB 1890:X$=DH$(2):GOSUB 1930:RETURN
- 1980 REM RESULT MESSAGES:
- 1990 X$="BLACKJACK":GOTO 2070 ' PLAYER BLACKJACK
- 2000 X$="BLACKJACK":GOTO 2090 ' DEALER BLACKJACK
- 2010 X$="BUST":GOTO 2070 ' PLAYER BUST
- 2020 X$="BUST":GOTO 2090 ' DEALER BUST
- 2030 X$="STAND-OFF":GOTO 2070 ' STAND-OFF
- 2040 X$="WIN":GOTO 2070 ' WIN
- 2050 X$="LOSS":GOTO 2070 ' LOSS
- 2060 X$="STAND":GOTO 2070 ' PLAYER STANDS
- 2070 COLOR 16,7
- 2080 LOCATE 17,PMC,0:A=PC-PMC:GOTO 2100
- 2090 COLOR 16,7:LOCATE 6,7,0:A=DC-7
- 2100 A=A+9-LEN(X$):IF A<0 THEN B=0:C=0 ELSE B=INT(A/2):C=A-B
- 2110 PRINT SPACE$(B);X$;SPACE$(C);:COLOR 7,0:RETURN
- 2120 IF MENU$="YES" THEN CHAIN "MENU",180 ELSE COLOR 7,0
- 2130 END
- 2140 REM INSTRUCTIONS - SCREEN 1
- 2150 PRINT " WELCOME TO BLACKJACK"
- 2160 PRINT
- 2170 PRINT "The object of the game is to get a higher count than the dealer without ex-"
- 2180 PRINT "ceeding 21. Aces count 1 or 11 (your choice). Kings, Queens and Jacks"
- 2190 PRINT "count 10. All other cards count at face value. You must bet before the deal."
- 2200 PRINT "You may bet any amount up to your balance.":PRINT
- 2210 PRINT "The dealer initially deals two cards to you and two cards to himself - one up"
- 2220 PRINT "and one down. A count of 21 on the initial deal is `Blackjack'. If you have"
- 2230 PRINT "Blackjack (and the dealer doesn't), the dealer pays off 3 for 2 immediately."
- 2240 PRINT "If the dealer has Blackjack (and you don't), you lose your bet and the hand"
- 2250 PRINT "is over. If you both have Blackjack, the hand is a `Stand-off' and your bet"
- 2260 PRINT "is returned. If the dealer shows an Ace on the initial deal, you may buy"
- 2270 PRINT "`Insurance' against the possibility that he has Blackjack. Insurance costs"
- 2280 PRINT "one-half of the amount you bet and pays twice the bet if the dealer has"
- 2290 PRINT "Blackjack.":PRINT
- 2300 PRINT "The next screen will have more instructions, but first, enter the amount of"
- 2310 PRINT "money you have to play the game.":RETURN
- 2320 REM INSTRUCTIONS - SCREEN 2
- 2330 PRINT "After the initial deal, you may ask for additional cards by asking for a"
- 2340 PRINT "`Hit'. You may ask for as many hits as you wish. However, if your count"
- 2350 PRINT "goes over 21, you are `Bust' and the hand is over. If you do not wish an"
- 2360 PRINT "additional hit, indicate `Stand'. After you stand, the dealer plays. The"
- 2370 PRINT "dealer must draw an additional card if his count is 16 or less and must"
- 2380 PRINT "stand if his count is 17 or more. If the dealer busts or the count in your"
- 2390 PRINT "hand exceeds the dealer's count, you win and the dealer pays off one-for-one."
- 2400 PRINT "If you both have the same count, your bet is returned. Otherwise, you lose.":PRINT
- 2410 PRINT "If your initial two cards are a pair or both have a count of 10, you may"
- 2420 PRINT "split them into two hands. Your original bet will be placed on each of the"
- 2430 PRINT "hands. Split hands are played one at a time. A two card count of 21 in a"
- 2440 PRINT "split hand is NOT Blackjack. Also, if you split a pair of Aces, you will be"
- 2450 PRINT "dealt one and only one additional card for each hand.":PRINT
- 2460 PRINT "If the initial count in your hand is 10 or 11, you may `Double' the bet on"
- 2470 PRINT "the hand. If you Double, the bet will be doubled and you will be dealt one"
- 2480 PRINT "and only one additional card.":PRINT
- 2490 PRINT "The game is over when you run out of money or decide to Quit. Good Luck!"
- 2500 PRINT "Now enter the amount of money you want to wager on the first hand."
- 2510 RETURN
- 2520 REM VARIABLES:
- 2530 REM DK - REMAINING DECK OF CARDS (INTEGERS, INITIALLY 1-52)
- 2540 REM DKI - LENGTH OF DK
- 2550 REM STKE - INITIAL STAKE
- 2560 REM BAL - PLAYERS CURRENT BALANCE
- 2570 REM NUM$ - A,2,...,10,J,Q,K
- 2580 REM SUITS$ - SYMBOLS FOR THE 4 SUITS
- 2590 REM PMC - PLAYER MESSAGE COLUMN
- 2600 REM PC - LEFT SIDE COLUMN OF LAST PLAYER'S CARD
- 2610 REM DC - LEFT SIDE COLUMN OF LAST DEALER UP CARD
- 2620 REM PH$ - VECTOR OF SYMBOLS OF PLAYER'S CARDS
- 2630 REM PHI - INDEX OF LAST PLAYER CARD
- 2640 REM DH$ - VECTOR OF SYMBOLS OF DEALER'S CARDS (DH$(2) IS HOLE CARD)
- 2650 REM DHI - INDEX OF DEALER'S LAST CARD
- 2660 REM DVAL - VALUE OF DEALER'S HAND ASSUMING ACE=1
- 2670 REM DACE - NUMBER OF ACES IN PLAYER'S HAND
- 2680 REM FOLLOWING 4 VARIABLES HAVE AS MANY ELEMENTS AS HANDS IN PLAY
- 2690 REM BT - BET
- 2700 REM PVAL - VALUE OF PLAYER'S HAND ASSUMING ACE=1
- 2710 REM PACE - NUMBER OF ACES IN PLAYER'S HAND
- 2720 REM PSV - UNDECODED 1-52 VALUE OF 1ST CARD IN HAND
- 2730 REM HNDS - NUMBER OF HANDS IN PLAY
- 2740 REM N - CURRENT HAND
- 2750 REM R - ROW NUMBER
- 2760 REM C - SCREEN COLUMN NUMBER
- 2770 REM AH - AUTOMATIC HIT SWITCH
- REM N - CURRENT HAND
- 2750 REM R - ROW NUMBER
- 2760 REM C - SCREEN COLUMN NUMBER
- 2